package com.bird.component.lang.util.paramcheck

import cn.hutool.core.util.ObjectUtil
import com.bird.component.lang.util.isnull
import com.bird.component.lang.util.paramcheck.inter.ICheckBean
import com.bird.component.lang.util.paramcheck.inter.ICheckModel
import java.util.function.Supplier

class RichUtil {
    companion object{
        /**
         * @param key                  校验模式的名称
         * @param iCheckBean           检验组装bean
         * @param defaultModelSupplier 当ParamCheckComponent.getCheckNode().getModelMap()中没有的[ICheckModel] 需要赋默认值
         */
        internal fun richCheckModelMap(
            key: String,
            iCheckBean: ICheckBean,
            defaultModelSupplier: Supplier<ICheckModel>
        ): ParameterCheckBuilder {
            val checkNode = ParamCheckUtil.getCheckNode()
            if (checkNode.isnull()
                || checkNode?.modelMap.isnull()
                || checkNode?.parameterCheckBuilder.isnull()
            ) {
                throw com.bird.component.lang.common.exception.ServiceException("ParamCheckComponent.getCheckNode() is null")
            }
            val checkModelMap = checkNode!!.modelMap!!
            if (ObjectUtil.hasEmpty(key, iCheckBean, defaultModelSupplier)) {
                return checkNode.parameterCheckBuilder
            }
            //每个key拿出的一定是自己的ICheckModel泛型
            val checkModel: ICheckModel= checkModelMap.getOrDefault(key, defaultModelSupplier.get())
            richCheckModel<Any>(checkModel, iCheckBean)
            checkModelMap[key] = checkModel
            return checkNode.parameterCheckBuilder
        }

        /**
         * 统一处理添加checkBean的逻辑
         */
        private fun <T> richCheckModel(checkModel: ICheckModel, tiCheckBean: ICheckBean) {
            checkModel.checkBeans.add(tiCheckBean)
        }
    }

}